package br.com.serctam.session;

import java.io.ByteArrayOutputStream;

import javax.ejb.Remove;
import javax.ejb.Stateful;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.persistence.HibernateSessionProxy;

import br.com.serctam.entity.BoletoPdf;
import br.com.serctam.entity.Candidato;
import org.jboss.seam.annotations.Destroy;

@Stateful
@Name("deferirIsento")
public class DeferirIsentoBean implements DeferirIsento
{
    @Logger private Log log;
    
    @In
    private HibernateSessionProxy hibernateSession;
    
    @In
    private GeradorNumeroInscricao geradorNumeroInscricao;
    
    @In(create=true)
    private GeradorBoleto geradorBoleto;
    
    private Long nossoNumero;

    @In StatusMessages statusMessages;
    
    @In
    private MailMessages mailMessages;
    
    @In(create=true)
    @Out(required=false)
    private BoletoPdf boletoPdf; 
    
    @Out(scope=ScopeType.CONVERSATION , required=false )
    private Candidato candidato;
    
    @Begin(join=true)
    public void buscaCandidato(){
    	
    	candidato = null;
        // implement your business logic here

		Criteria crt =  hibernateSession.createCriteria(Candidato.class);
		
		if( nossoNumero != null){
			crt.add(Restrictions.eq("id", nossoNumero));
			candidato = (Candidato)crt.uniqueResult();
		}
		
		if(candidato != null && candidato.getNumeroInscricao() != null){
	        statusMessages.add("#{messages.naoPodeSerIsentado}");
	        Conversation.instance().end();
		} else if(candidato != null && candidato.getSolicitouDesconto() != null && candidato.getSolicitouDesconto() && candidato.getFoiDeferidoDesconto() != null && candidato.getFoiDeferidoDesconto()){
			statusMessages.add("#{messages.naoPodeReceberIsencaoPoisTeveDesconto}");
			
		} else if(candidato != null && candidato.getSolicitouDesconto() != null && candidato.getSolicitouDesconto() && candidato.getFoiDeferidoDesconto() != null && !candidato.getFoiDeferidoDesconto()){
			statusMessages.add("#{messages.naoPodeReceberIsencaoPoisFoiNegadoDesconto}");
			
		} else if(candidato != null && candidato.getSolicitouIsencao() != null && candidato.getSolicitouIsencao() && candidato.getFoiDeferidoIsencao() != null && candidato.getFoiDeferidoIsencao()){
			statusMessages.add("#{messages.naoPodeReceberIsencaoDuas2Vez}");
			
		} else if(candidato != null && candidato.getSolicitouIsencao() != null && candidato.getSolicitouIsencao() && candidato.getFoiDeferidoIsencao() != null && !candidato.getFoiDeferidoIsencao()){
			statusMessages.add("#{messages.naoPodeReceberIsencaoPoisFoiNegadaAnteriormente}");

		}
		
    	
    }
    
    public boolean habilita(){
    	
    	if(candidato == null){
    		return false;
    	}
    	
    	if(StringUtils.isNotEmpty(candidato.getNumeroInscricao())){
    		return false;
    	}
    	
		if(candidato != null && candidato.getSolicitouIsencao() != null && candidato.getSolicitouIsencao() && candidato.getFoiDeferidoIsencao() != null && candidato.getFoiDeferidoIsencao()){
    		return false;			
		} 
		
		if(candidato != null && candidato.getSolicitouIsencao() != null && candidato.getSolicitouIsencao() && candidato.getFoiDeferidoIsencao() != null && !candidato.getFoiDeferidoIsencao()){
    		return false;		
    	}
    	
    	if ( null == candidato.getSolicitouDesconto()) {
			return true;
		}
    	
    	return false;
    	
    }



    @End
    public void deferirIsento()
    {
    	
    	
        log.info("Deferir Isento, candidato id "+ candidato.getId());
        candidato.setStatusPagamento("IST");
        candidato.setSolicitouIsencao(true);
        candidato.setFoiDeferidoIsencao(true);
        
    	//Gerar proximo numero inscricao
    	Integer numeroInscricao = geradorNumeroInscricao.nextVal(candidato.getCargo());
    	candidato.setNumeroInscricao(numeroInscricao.toString());

        
        hibernateSession.merge(candidato);
        statusMessages.add("#{messages.candidatoIsentado}");
        mailMessages.enviarConfirmacaoDeferimentoIsento(candidato);
        
        
    }
    
    @End
    public void naoDeferirIsento(){

    	//Gera novo Boleto
    	//geradorBoleto.gerarBoleto(false);
        //Guarda referencia boleto antigo para excluir
        BoletoPdf boletoAntigo = candidato.getBoletoPdf();

    	//Gera novo Boleto
    	ByteArrayOutputStream boleto = geradorBoleto.gerarBoleto(false);
    	boletoPdf.setBoletopdf(boleto.toByteArray());
    	candidato.setBoletoPdf(boletoPdf);

    	
        log.info("Nao Deferir Isento, candidato id "+ candidato.getId());
        candidato.setStatusPagamento("APG");
        candidato.setSolicitouIsencao(true);
        candidato.setFoiDeferidoIsencao(false);
        hibernateSession.merge(candidato);
        statusMessages.add("#{messages.candidadtoNaoIsentado}");
        mailMessages.enviarConfirmacaoNaoDeferimentoIsento(candidato);
    }

// add additional action methods


    @Destroy
    @Remove
    public void destroy() {}


	public Long getNossoNumero() {
		return nossoNumero;
	}


	public void setNossoNumero(Long nossoNumero) {
		this.nossoNumero = nossoNumero;
	}


	public Candidato getCandidato() {
		return candidato;
	}


	public void setCandidato(Candidato candidato) {
		this.candidato = candidato;
	}

}
